package com.zang.blogz.utils;


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.zang.blogz.constant.ResultConstant;
import io.github.vampireachao.stream.core.optional.Opp;
import io.swagger.annotations.ApiModelProperty;

import java.lang.reflect.Field;


/**
 * @Author: ZVerify
 * @Description: 初始化查询条件构造
 * @DateTime: 2022/9/4 16:41
 **/
public class SearchQueryInit {

    public static  <T> QueryWrapper<T> getQueryWrapper(Object DTO,Class<T> clazz){

        QueryWrapper<T> queryWrapper = new QueryWrapper<>();

        // 获取所有属性
        for(Field f : DTO.getClass().getDeclaredFields()) {
            // 得到私有属性
            f.setAccessible(true);

            Opp.ofTry(() -> {

                if (f.get(DTO) != null) {
                    // 得到属性上的注解
                    ApiModelProperty field = f.getAnnotation(ApiModelProperty.class);

                    // 在其不为空的情况下
                    Opp.ofStr(field.value()).ifPresent(fQ->{

                        try {

                            // 如果是字符串类型的字段单独处理，过滤掉字符串为""or"    "的,然后进行构造
                            Opp<Object> opp = Opp.of(f.get(DTO)).typeOfPeek((String s) -> Opp.ofStr(s).ifPresent(Fq -> queryWrapper.like(fQ, Fq)));

                            // 如果不是字符传则正常处理
                            if (opp.isEmpty()){

                                queryWrapper.like(fQ, f.get(DTO));
                            }

                        } catch (IllegalAccessException e) {

                            throw new RuntimeException(ResultConstant.InitializationMessage.SEARCH_STRUCTURE);
                        }

                    });

                }
                return null;

            });

        }

        return queryWrapper;

    }
}